<?php

declare(strict_types=1);

namespace Modules\User\Http\Controllers;

use Catch\Base\CatchController as Controller;
use Illuminate\Http\Request;
use Modules\User\Models\LogBehavior;

/**
 * @class LogBehaviorController
 */
class LogBehaviorController extends Controller
{
    /**
     * @param LogBehavior $model
     */
    public function __construct(
        protected readonly LogBehavior $model,
    ) {
    }

    /**
     * 列表
     *
     * @return mixed
     */
    public function index(Request $request): mixed
    {
        // 使用CatchAdmin规范：通过setBeforeGetList处理关联关系，然后返回分页数据
        $paginator =  $this->model->setBeforeGetList(function ($query) use($request) {
            // 构建查询关联关系
            $query->from('log_behavior')
                ->join('admin_users', 'log_behavior.creator_id', '=', 'admin_users.id');
            // 选择需要返回的字段
            $query->select([
                'admin_users.username AS username',
                'log_behavior.module',
                'log_behavior.business',
                'log_behavior.operation',
                'log_behavior.operate_ip',
                'log_behavior.created_at',
            ]);
            //接收参数
            if($creatorId = $request->input('creator_id')){
                $query->where('log_behavior.creator_id', $creatorId);
            }
            // 处理开始时间和结束时间筛选条件
            if ($startAt = $request->input('start_at')) {
                $query->where('log_behavior.created_at', '>=', strtotime($startAt));
            }
            if ($endAt = $request->input('end_at')) {
                $query->where('log_behavior.created_at', '<=', strtotime($endAt));
            }
            return $query;
        })->getList();

        // 获取分页信息用于序列号计算
        $currentPage = $paginator->currentPage(); // 当前页码（从 1 开始）
        $perPage = $paginator->perPage(); // 每页显示的条数

        // 对结果集进行后处理，添加序列号和格式化时间字段
        $paginator->getCollection()->transform(function ($item, $index) use ($currentPage, $perPage) {
            // 计算并添加序列号：(当前页-1)*每页条数 + 索引（从0开始） + 1
            $serialNumber = ($currentPage - 1) * $perPage + $index + 1;
            $item->serial_number = $serialNumber;

            return $item;
        });
        return $paginator;
    }

    /**
     * 删除数据
     *
     * @param mixed $id
     * @return mixed
     */
    public function destroy(mixed $id): mixed
    {
        return $this->model->deleteBy($id);
    }
}